use anyhow::Result;
use automation::spider_utils::{crawl_website, CrawlConfiguration, crawl_single_page};
use automation::init_logger;
use log::info;
use std::fs;
use std::path::Path;

#[tokio::main]
async fn main() -> Result<()> {
    // 初始化日志系统
    init_logger();
    // 确保 resources 目录存在
    let resources_dir = Path::new("resources");
    if !resources_dir.exists() {
        fs::create_dir_all(resources_dir)?;
        info!("创建 resources 目录");
    }

    // 示例1: 爬取单个页面
    info!("示例1: 爬取单个页面");
    let url = "https://cisco.github.io/ChezScheme/csug/csug.html";
    let result = crawl_single_page(url, 30).await?;

    // 保存结果到文件
    let file_path = resources_dir.join("single_page.html");
    fs::write(&file_path, &result.content)?;
    info!("成功爬取并保存单个页面到 {}", file_path.display());
    info!("页面大小: {} 字节", result.content.len());

    // 示例2: 使用自定义配置爬取多个页面
    info!("示例2: 使用自定义配置爬取多个页面");
    let config = CrawlConfiguration {
        respect_robots_txt: true,
        subdomains: false,
        tld: false,
        delay: 100,
        depth: 1,
        page_limit: 5,
        timeout: 30,
        user_agent: Some("AutomationSpider/1.0".to_string()),
        verbose: true,
        whitelist_url: None,
        blacklist_url: None,
    };

    let base_url = "https://cisco.github.io/ChezScheme/csug/";
    let results = crawl_website(config, base_url).await?;

    // 创建子目录保存多个页面
    let multi_pages_dir = resources_dir.join("multi_pages");
    if !multi_pages_dir.exists() {
        fs::create_dir_all(&multi_pages_dir)?;
    }

    // 保存所有爬取的页面
    for (i, result) in results.iter().enumerate() {
        // 从URL提取文件名
        let file_name = match url::Url::parse(&result.url) {
            Ok(parsed_url) => {
                let path = parsed_url.path();
                if path.ends_with('/') || path == "/" {
                    format!("index_{}.html", i)
                } else {
                    Path::new(path)
                        .file_name()
                        .map(|f| f.to_string_lossy().to_string())
                        .unwrap_or_else(|| format!("page_{}.html", i))
                }
            },
            Err(_) => format!("page_{}.html", i),
        };

        // 保存到文件
        let file_path = multi_pages_dir.join(&file_name);
        fs::write(&file_path, &result.content)?;
        info!("保存页面 {}: {}", i + 1, file_path.display());
    }

    info!("成功爬取 {} 个页面到 {}", results.len(), multi_pages_dir.display());

    Ok(())
}
